iT邦幫忙

2025 iThome 鐵人賽

DAY 29
0

例外情況(exception)

當某個函式無法正常進行時,停止正在執行的動作,並立即跳到某個知道如何處理問題的地方,這就是例外情況機制的作用

如何拋出/引發例外(exception)

throw new Error語法

堆疊展開(stack unwinding)

當程式遇到問題時引發/丟出例外時,程式不僅會停止執行跳出目前執行函式的作用域,還會一路往下跳直到跳出啟動這次呼叫為止,這就稱為堆疊展開

可以將堆疊展開視為一種緊急機制,該機制會中斷一連串函式的執行

堆疊展開的過程

  1. 拋出例外(Throwing the exception)
    throw執行時,會直接終止當下執行的函式內容
  2. 堆疊展開(Unwinding the stack)
    js 引擎檢查 call stack 中的 function list,依此類推,不斷往 stack 底部移動
    • 離開當下的function scope
    • 檢查呼叫當下 function scope 的 function scope,往 stack 底部移動
  3. 搜尋處理程序
    直到以下兩種情況發生
    • 找到catch區塊,停止展開,並把 exception 傳給 catch,然後 從那裡開始繼續執行
    • 到達堆疊底部/根節點,通常是 root 或 global scope,程式將終止,但這可能導致程式的崩潰(crash)

使用 try..catch 避免堆疊展開至 global scope

為了避免這種情況,因此throw new Error務必搭配try..catch使用

並不需要把所有 function 都用 try..catch 包圍,try..catch 用於以下幾個場合

  1. Localize handling
    圍繞 I/O(imput/output) 關連,可能因外部因素而產生錯誤點的區塊
    fetch data from backend api, parsing user input, 與第三方函式庫的協同工作等等
    假設程式遇到問題則可以跳出,得到錯誤相關聯的訊息並且從中斷點後繼續執行其他程式碼
function fetchFromApi() {
    const request = new Request("https://name_of_api", { method: "GET" });
    fetch(request)
        .then((response) => {
            if (response.status !== 200) {
                throw new Error("something went wrong on API server");
            }
            return response.json;
        })
        .then((response) => {
            console.debug(response);
        })
        .catch((error) => {
            console.error(error);
        });
}
fetchFromApi();
  1. Global Protection(The Topmost Scope)
    像 Node.js 建構應用程式的 entry point,以避免遭遇錯誤時整個程式崩潰,並將完整的錯誤捕獲

上一篇
Chapter 8 Bugs & Errors-day28
下一篇
Chapter 8 Bugs & Errors-day30
系列文
溫故而知新:Eloquent Javascript 閱讀筆記30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言